« powrót

Budowa serwisu web do zarządzania własnymi projektami (cz. I)

Opublikowano: 2009-11-07 , wyświetlono: 10864

Informacja o stanie repozytorium SVN

Moja codzienność polega na równoczesnej pracy nad wieloma projektami. Dotychczas stworzone oprogramowanie wymaga ciągłych zmian, tj. nowych funkcji wymaganych przez użytkowników, refaktoryzacji wymaganych przeze mnie lub głębszego przeprojektowania ze względu na zmiany technologii. Rozpoczynam oczywiście też realizację wciąż nowych projektów.

Po latach doświadczeń i różnych problemów związanych z tego rodzaju trybem pracy postanowiłem trochę ułatwić sobie "życie".

Pierwszym elementem, który musiałem ogarnąć to zarządzanie kodem źródłowym. Mój wybór padł na SVNa. Po jakimś czasie zorientowałem się, że potrzebuję informacji o stanie repozytorium bo znudziło mi się ciągłe skakanie po katalogach i wykonywanie komend svn status i svn log. Tym bardziej, że do niektórych aplikacji wracałem po miesiącach nieobecności.

Zamarzył mi się serwis web'owy, w którym miałbym wszystkie potrzebne mi informacje. Od razu pomyślałem, że byłby to nowy projekt nad którym musiałbym pracować. Czyli zamiast sobie polepszyć dołożyłbym sobie pracy. By zminimalizować ten wysiłek stwierdziłem, że do informacji wystarczą mi statyczne HTMLe bez żadnej bazy danych, interakcji, które mogłyby być wygenerowane przez jakieś oprogramowanie. Stanęło jak zwykle na tym, że muszę coś takiego napisać. Jako że używam środowiska Windows ja wykorzystałem wbudowanego IISa.

Z pomocy SVNa wyczytałem, że potrafi można wyniki jego działań skierować do plików XML. To juz jakieś uporządkowane dane, które można przetworzyć. Te XML'w zmusiły mnie do zapoznania się z XSLT. Jak się okazało to całkiem efektywne zajęcie.

Pierwszym krokiem jaki zrobiłem była lista projektów w repozytorium, która zawierałaby trochę informacji o ich stanie. Jak na początek to już by było coś.

Wybrałem komendę svn info i rozpocząłem zapisu danych do pliku info.xml. W kodzie poniżej znajduje się komenda alias mapująca katalogi. Znalazłem taki użyteczny program o nazwie junction.exe i zmieniłem jego nazwę na alias.exe bo ta bardziej mi pasowała.


@echo off
alias C:\www C:\Inetpub\wwwroot

type \www\project\svn\info_head.inc > \www\project\svn\info.xml

svn info file:///x:/svnrep/projekt1 --xml --incremental >> \www\project\svn\info.xml
svn info file:///x:/svnrep/projekt2 --xml --incremental >> \www\project\svn\info.xml
svn info file:///x:/svnrep/projekt3 --xml --incremental >> \www\project\svn\info.xml
svn info file:///x:/svnrep/projekt4 --xml --incremental >> \www\project\svn\info.xml

setlocal
set _user=svnuser
set _pass=svnpadd
svn info https://svn.host.pl/project5/ --username %_user% --password %_pass% --xml --incremental >> \www\project\svn\info.xml
endlocal

type \www\project\svn\info_foot.inc >> \www\project\svn\info.xml

Wykorzystałem dwa pliki info_head.inc i info_foot.inc do prawidłowego skonstuowania pliku xml.


[info_head.inc]
<?xml version="1.0" encoding="utf-8"?>
<info>

[info_foot.inc]
</info>

Dostałem zbiór z informacjami o liście repozytoriów i ich stanie. Zostało tylko w jakiś sposób
pokazać to w przystępny sposób. Skorzystałem z arkusza XSLT tworząc plik info.xsl


<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"  xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  
<xsl:output method="html" encoding="utf-8"/>

<xsl:template match="/">
  <html>
    <head>
      <title>SVN Repository</title>
      <link rel="stylesheet" type="text/css" href="svn.css" />      
      <link xmlns="http://www.w3.org/1999/xhtml" rel="stylesheet" type="text/css" href="svn.css" />
    </head>
  <body>

  <h1>SVN Repository  </h1>

    <a href="../index.htm">
        <xsl:text>&#171;</xsl:text> Back to projects home page
    </a>
    <br /><br />
  
    <table border="0" cellspacing="0" cellpadding="5">
      <tr>
        <th width="200">Project name</th>
        <th width="50">Revision</th>
        <th width="100">Updated date</th>
        <th width="300">Repository url</th>
        <th width="60"> </th>
        <th width="60"> </th>
        <th width="120"> </th>
      </tr>
    <xsl:for-each select="info/entry">
      <xsl:sort select="commit/date" order="descending"/>
      <tr><td>
        <b><xsl:value-of select="@path"/></b>
      </td>
      <td>
        <xsl:value-of select="commit/@revision"/>
      </td>
      <td>
        <xsl:value-of select="substring(commit/date, 1, 10)"/>
      </td>
      <td>
        <xsl:value-of select="url"/>
      </td>
      <td>
        <a><xsl:attribute name="href">
          <xsl:value-of select="concat(@path, '_status.htm')"/></xsl:attribute> 
          Status
        </a>
      </td>
      <td>
        <a><xsl:attribute name="href">
          <xsl:value-of select="concat(@path, '.htm')"/></xsl:attribute> 
          Log
        </a>
      </td>
      <td>
        <a><xsl:attribute name="href">
          <xsl:value-of select="concat(@path, '_cloc.htm')"/></xsl:attribute> 
          Code statistics
        </a>
      </td>
      </tr>
    </xsl:for-each>
    </table>

  <p class="foot" align="center">
    (c) Chinasoft 2009 http://www.chinasoft.com.pl
  </p>
  
  </body>
  </html>
</xsl:template>

</xsl:stylesheet>

i wywołania standardowego procesora.


msxsl \www\project\svn\info.xml \www\project\svn\info.xsl > \www\project\svn\svninfo.htm

W ten sposób powstała strona html svninfo.htm. Przy każdym projekcie są linki
(Status, Log, Code statistics), które zostaną omówione w następnych części tekstu.

Wygląd mojej strony z informacjami o repozytorium
{info_block_title}

Na koniec jeszcze tylko przedstawię zewnętrzny plik css, który został wykorzystany.


body
{
  font-family: Verdana, Arial, Helvetica, sans-serif;
  font-size: 12px;
}

h1
{
  margin-top: 10px;
  margin-bottom: 10px;
  font-size: 16px;
  background-color: #FFEFD4;
  padding: 10px;
  border-top: 3px solid #A0684F;
  border-bottom: 3px solid #A0684F;
}

a
{
  color: #493534;
  font-weight: bold;
  text-decoration: none;
}
a:hover
{
  text-decoration: underline;
}

.caption
{
  height: 28px;
  font-family: Verdana, Arial, Helvetica, sans-serif;
  font-size: 12px;
  font-weight: bold;
  text-align: left;
  background-color: #5F3E35;
  color: #fff;
  padding-top: 5px;
  padding-bottom: 5px;
  padding-left: 25px;
  padding-right: 25px;
}

th
{
  font-family: Verdana, Arial, Helvetica, sans-serif;
  font-size: 12px;
  font-weight: bold;
  text-align: left;
  color: #fff;
  background-color: #A0684F;
  border-bottom: 1px solid #fff;
}

td
{
  font-family: Verdana, Arial, Helvetica, sans-serif;
  font-size: 12px;
  background-color: #FFEFD4;
  border-bottom: 1px solid #fff;
  vertical-align: top;
}

p.foot
{
  border-top: 3px solid #A0684F;
  padding-top: 10px;
  color: #888;
}


Komentarze: